//
//  UIButton+YKOCExection.h
//  YKOCExection
//
//  Created by edward on 2020/6/11.
//  Copyright © 2020 edward. All rights reserved.
//

#import "UIButton+YKOCExection.h"
#import <objc/runtime.h>

@implementation UIButton (YKOCExection)

- (UIButton *(^)(NSString *))yk_title
{
    return ^UIButton *(NSString *title) {
        [self setTitle:title forState:UIControlStateNormal];
        return self;
    };
}

- (UIButton *(^)(UIColor *titleColor))yk_titleColor
{
    return ^UIButton*(UIColor *titleColor) {
        [self setTitleColor:titleColor forState:UIControlStateNormal];
        return self;
    };
}

- (UIButton *(^)(UIColor *titleColor,UIControlState state))yk_titleColorState
{
    return ^UIButton*(UIColor *titleColor,UIControlState state) {
        [self setTitleColor:titleColor forState:state];
        return self;
    };
}

- (UIButton *(^)(NSString *title,UIControlState state))yk_titleState
{
    return ^UIButton*(NSString *title,UIControlState state) {
        [self setTitle:title forState:state];
        return self;
    };
}

- (UIButton *(^)(CGFloat titleFontSize))yk_titleFontSize
{
    return ^UIButton*(CGFloat titleFontSize) {
        self.titleLabel.font = [UIFont systemFontOfSize:titleFontSize];
        return self;
    };
}

- (UIButton *(^)(UIImage *image))yk_image
{
    return ^UIButton*(UIImage *image) {
        [self setImage:image forState:UIControlStateNormal];
        return self;
    };
}

- (UIButton *(^)(UIImage *image,UIControlState state))yk_imageState
{
    return ^UIButton*(UIImage *image,UIControlState state) {
        [self setImage:image forState:state];
        return self;
    };
}

- (UIButton *(^)(UIEdgeInsets titleInset))yk_titleInset
{
    return ^UIButton*(UIEdgeInsets titleInset) {
        self.titleEdgeInsets = titleInset;
        return self;
    };
}

- (UIButton *(^)(UIImage *))yk_backgroundImage
{
    return ^UIButton*(UIImage *image) {
        [self setBackgroundImage:image forState:UIControlStateNormal];
        return self;
    };
}

- (UIButton *(^)(UIEdgeInsets imageInset))yk_imageInset
{
    return ^UIButton *(UIEdgeInsets inset) {
        self.imageEdgeInsets = inset;
        return self;
    };
}

- (void)yk_layoutButtonWithEdgeInsetsStyle:(YKButtonEdgeInsetsStyle)style
                        imageTitleSpace:(CGFloat)space {
    /**
     *  前置知识点：titleEdgeInsets是title相对于其上下左右的inset，跟tableView的contentInset是类似的，
     *  如果只有title，那它上下左右都是相对于button的，image也是一样；
     *  如果同时有image和label，那这时候image的上左下是相对于button，右边是相对于label的；title的上右下是相对于button，左边是相对于image的。
     */
    
    // 1. 得到imageView和titleLabel的宽、高
    CGFloat imageWith = self.imageView.frame.size.width;
    CGFloat imageHeight = self.imageView.frame.size.height;
    
    // 由于iOS8中titleLabel的size为0，用下面的这种设置
    CGFloat labelWidth = self.titleLabel.intrinsicContentSize.width;
    CGFloat labelHeight = self.titleLabel.intrinsicContentSize.height;
    
    // 2. 声明全局的imageEdgeInsets和labelEdgeInsets
    UIEdgeInsets imageEdgeInsets = UIEdgeInsetsZero;
    UIEdgeInsets labelEdgeInsets = UIEdgeInsetsZero;
    
    // 3. 根据style和space得到imageEdgeInsets和labelEdgeInsets的值
    switch (style) {
        case YKButtonEdgeInsetsStyleTop:
        {
            imageEdgeInsets = UIEdgeInsetsMake(-labelHeight - space / 2.0, 0, 0, -labelWidth);
            labelEdgeInsets = UIEdgeInsetsMake(0, -imageWith, -imageHeight - space / 2.0, 0);
        }
            break;
        case YKButtonEdgeInsetsStyleLeft:
        {
            imageEdgeInsets = UIEdgeInsetsMake(0, -space / 2.0, 0, space / 2.0);
            labelEdgeInsets = UIEdgeInsetsMake(0, space / 2.0, 0, -space / 2.0);
        }
            break;
        case YKButtonEdgeInsetsStyleBottom:
        {
            imageEdgeInsets = UIEdgeInsetsMake(0, 0, -labelHeight - space / 2.0, -labelWidth);
            labelEdgeInsets = UIEdgeInsetsMake(-imageHeight - space / 2.0, -imageWith, 0, 0);
        }
            break;
        case YKButtonEdgeInsetsStyleRight:
        {
            imageEdgeInsets = UIEdgeInsetsMake(0, labelWidth + space / 2.0, 0, -labelWidth - space / 2.0);
            labelEdgeInsets = UIEdgeInsetsMake(0, -imageWith - space / 2.0, 0, imageWith + space / 2.0);
        }
            break;
        default:
            break;
    }
    
    // 4. 赋值
    self.titleEdgeInsets = labelEdgeInsets;
    self.imageEdgeInsets = imageEdgeInsets;
}


static char eventKey;

- (void)yk_handleControlEvent:(UIControlEvents)event withBlock:(ButtonClickedBlock)action {
    objc_setAssociatedObject(self, &eventKey, action, OBJC_ASSOCIATION_COPY_NONATOMIC);
    [self addTarget:self action:@selector(dk_callActionBlock:) forControlEvents:event];
}

- (void)dk_callActionBlock:(UIButton *)sender {
    ButtonClickedBlock block = (ButtonClickedBlock)objc_getAssociatedObject(self, &eventKey);
    if (block) {
        block(sender);
    }
}



@end
